#include "filtrelecture.h"

/* constructeur par default de la classe*/
filtrelecture::filtrelecture() : tbb::filter(serial_in_order) {
	//si il n'y a pas d'arguments on ne fait rien
}

/*constructeur de la classe */
filtrelecture::filtrelecture(char *chemin_fichier) : tbb::filter(serial_in_order){
	if (chemin_fichier == NULL){
		std::cout<<"pas de fichier"<<std::endl;//si le chemain du fichier est vide on affiche une erreur
	}
	else 
	{
		this->lecturefichier = new lecture( chemin_fichier);//on crée une classe lecteur avec comme parrametre de constructeur le chemain du fichier a ouvrir
		this->lign_add = new std::vector<int>;//création d'un vecteur contenant la somme des lignes lue precedament
		this->ligne_extraite = new std::vector<int>;//creation d'un vecteur contenant la ligne courante lue
		this->iteration = 0;//varriable pour dectecter la premiere fois que l'on lance le filtre
	}

}

/*destructeur par defaut du filtre */
filtrelecture::~filtrelecture(){
	//supression des pointeurs
	delete this->lecturefichier;
	delete this->ligne_extraite;
	delete this->lign_add;
	//fin supression des pointeurs
}

/* fonction lancer lors de l'appel du filtre*/
//cette fonction est rapeller tant qu'elle ne retourne pas un pointeur NULL
void* filtrelecture::operator ()(void *){
	*(this->ligne_extraite) = (*(this->lecturefichier)).Lecture_ligne();//la ligne lue est mise dans le veteur ligne extraite
	if((*(this->ligne_extraite)).size() !=0 )//si il y des valeurs dans le vecteur
	{
		if(this->iteration == 0)//si on execute pour la premiere fois le filtre
		{
			(*this->lign_add)= *(this->ligne_extraite);// vecteur lign_add = vecteur ligne_extraite
		}
		else//si ce n'est pas la premiere fois que le filtre est appeller
		{
			for(int i =0; i< (*(this->ligne_extraite)).size();i++)//on ajoute les valeurs contenue dans le vecteur ligne_extraite aux valleurs sontenue dans le vecteur lign_add
			{
				(*(this->lign_add))[i] = (*(this->lign_add))[i] + (*(this->ligne_extraite))[i];//pour chaque case des vecteurs
			}
		}
		iteration++;//on incremente iteration chaque fois que le filtre est appeller
		this->ligne_return= this->lign_add;//on met lign_add dans le vecteur de retourd
		return this->ligne_return;//on retroune le vecteur de retourd

	}
	else // si le vecteur lu est NULL
	{
		return NULL;//on retourne NULL pour arretter le rappel du filtre, car on a plus de ligne a lire
	}

}
